package P133_UseNewNorCloneAsFarAsPossible;

/**
 * Desc:&emsp;&ensp;
 * 建议133 ： 若非必要， 不要克隆对象
 * 通过方法生成一个对象时， 就会不再执行构造函数了， 只是在内存中进行数据块
 * 的拷贝， 此方法看上去似乎应该比new 方法的性能好很多， 但是Java 的缔造者们也认识到
 * 二八原则” ， 80 ％ （ 甚至更多） 的对象是通过new 关键字创建出来的， 所以对new 在生成
 * 对象（ 分配内存、初始化） 时做了充分的性能优化， 事实上， 一般情况下new 生成的对象比
 * clone 生成的性能方面要好很多， 例如这样的代码。
 *
 * @author 李渊&emsp;liyuan7@yusys.com.cn
 * @version 1.0
 * @since V4.3&emsp;2022/5/20
 */
public class UseNewNorCloneAsFarAsPossible {
    private static class Apple implements Cloneable{
        public Object clone(){
            try{
                return super.clone();
            }catch(CloneNotSupportedException e){
                throw new Error();
            }

        }
    }

    public static void main(String[] args) {
        //循环10万次
        final int maxLoops = 10 * 10000;
        int loops = 0;
        long start = System.nanoTime();
        // 母对象
        Apple apple = new Apple();
        while(++loops < maxLoops){
            apple.clone();
        }
        long mid = System.nanoTime();
        System.out.println("clone 生成对象耗时：" + (mid - start) + "ns");

        while (--loops >0){
            new Apple();
        }
        long end = System.nanoTime();
        System.out.println("new 生成对象耗时：" + (end - mid) + "ns");
    }
}
